package com.geccocrawler.gecco.dynamic;

import javassist.CtClass;
import javassist.bytecode.ConstPool;

/**
 * 动态生成SpiderBean
 *
 * @author huchengyi
 */
public interface DynamicBean {

    /**
     * 构造一个SpiderBean
     *
     * @param matchUrl  匹配url
     * @param pipelines 管道过滤器
     * @return SpiderBean
     */
    JavassistDynamicBean gecco(String[] matchUrl, String... pipelines);

    JavassistDynamicBean gecco(String matchUrl, String... pipelines);

    /**
     * 构造一个SpiderBean
     *
     * @param matchUrl   匹配url
     * @param downloader 下载器
     * @param timeout    超时时间
     * @param pipelines  管道过滤器
     * @return SpiderBean
     */
    JavassistDynamicBean gecco(String[] matchUrl, String downloader, int timeout, String... pipelines);

    JavassistDynamicBean gecco(String matchUrl, String downloader, int timeout, String... pipelines);

    //断言的动态生成，add by zhao.weiwei
    JavassistDynamicBean gecco(String[] matchUrl, String downloader, String assertion, String assertionRule, int timeout, String... pipelines);

    //断言的动态生成，add by zhao.weiwei
    JavassistDynamicBean gecco(String matchUrl, String downloader, String assertion, String assertionRule, int timeout, String... pipelines);


    //下载异常处理的动态生成，add by zhao.weiwei
    JavassistDynamicBean gecco(String[] matchUrl, String downloader, String assertion, String assertionRule, String downloadExhand, int timeout, String... pipelines);

    //下载异常处理的动态生成，add by zhao.weiwei
    JavassistDynamicBean gecco(String matchUrl, String downloader, String assertion, String assertionRule, String downloadExhand, int timeout, String... pipelines);

    /**
     * 获取一个已有字段
     *
     * @param fieldName 已有字段名称
     * @return 字段
     */
    DynamicField existField(String fieldName);

    /**
     * 由于有歧义，已经被existField代替
     *
     * @param fieldName 字段名称
     * @return DynamicField
     */
    @Deprecated
    DynamicField field(String fieldName);

    /**
     * 新增一个字段，如果已经存在返回当前字段
     *
     * @param fieldName 字段名称
     * @param fieldType 字段类型
     * @return DynamicField
     */
    DynamicField field(String fieldName, CtClass fieldType);

    DynamicField field(String fieldName, Class<?> fieldClass);

    /**
     * 删除一个属性
     *
     * @param fieldName 字段名
     * @return DynamicBean
     */
    DynamicBean removeField(String fieldName);

    /**
     * string类型字段
     *
     * @param fieldName 字段名
     * @return 字段
     */
    DynamicField stringField(String fieldName);

    /**
     * int类型字段
     *
     * @param fieldName 字段名
     * @return 字段
     */
    DynamicField intField(String fieldName);

    /**
     * long类型字段
     *
     * @param fieldName 字段名
     * @return 字段
     */
    DynamicField longField(String fieldName);

    /**
     * float类型字段
     *
     * @param fieldName 字段名
     * @return 字段
     */
    DynamicField floatField(String fieldName);

    /**
     * double类型字段
     *
     * @param fieldName 字段名
     * @return 字段
     */
    DynamicField doubleField(String fieldName);

    /**
     * HttpRequest类型字段
     *
     * @param fieldName 字段名
     * @return 字段
     */
    DynamicField requestField(String fieldName);

    /**
     * HttpResponse类型字段
     *
     * @param fieldName 字段名
     * @return 字段
     */
    DynamicField responseField(String fieldName);

    /**
     * List类型的字段
     *
     * @param fieldName   字段名
     * @param memberClass list的成员类型
     * @return 字段
     */
    DynamicField listField(String fieldName, Class<?> memberClass);

    /**
     * 将加载的bean注册到爬虫引擎中。
     * 主要应用在先定义Bean后期的爬虫引擎的情况。
     *
     * @return spiderBeanClass
     */
    Class<?> register();

    /**
     * 加载bean到classloader中
     *
     * @return spiderBeanClass
     */
    Class<?> loadClass();

    /**
     * 卸载bean
     */
    void unloadClass();

    /**
     * Constant pool table.
     *
     * @return ConstPool
     */
    ConstPool getConstPool();
}
